/**
 * ***************************************************************************** Copyright (c) 2000,
 * 2011 IBM Corporation and others. All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * <p>Contributors: IBM Corporation - initial API and implementation
 * *****************************************************************************
 */
package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types;

import org.eclipse.jdt.core.IJavaProject;

public final class PrimitiveType extends TType {

  /** Type code for the primitive type "int". */
  public static final int INT = 0;
  /** Type code for the primitive type "char". */
  public static final int CHAR = 1;
  /** Type code for the primitive type "boolean". */
  public static final int BOOLEAN = 2;
  /** Type code for the primitive type "short". */
  public static final int SHORT = 3;
  /** Type code for the primitive type "long". */
  public static final int LONG = 4;
  /** Type code for the primitive type "float". */
  public static final int FLOAT = 5;
  /** Type code for the primitive type "double". */
  public static final int DOUBLE = 6;
  /** Type code for the primitive type "byte". */
  public static final int BYTE = 7;

  static final String[] NAMES = {
    "int", // $NON-NLS-1$
    "char", // $NON-NLS-1$
    "boolean", // $NON-NLS-1$
    "short", // $NON-NLS-1$
    "long", // $NON-NLS-1$
    "float", // $NON-NLS-1$
    "double", // $NON-NLS-1$
    "byte"
  }; // $NON-NLS-1$

  private int fId;

  protected PrimitiveType(TypeEnvironment environment, int id, String signature) {
    super(environment, signature);
    fId = id;
  }

  public int getId() {
    return fId;
  }

  @Override
  public int getKind() {
    return PRIMITIVE_TYPE;
  }

  @Override
  protected boolean doEquals(TType type) {
    return fId == ((PrimitiveType) type).fId;
  }

  @Override
  public int hashCode() {
    return fId;
  }

  @Override
  protected boolean doCanAssignTo(TType lhs) {
    if (lhs.getKind() != PRIMITIVE_TYPE) {
      if (lhs.getKind() == STANDARD_TYPE) {
        IJavaProject javaProject = ((StandardType) lhs).getJavaElementType().getJavaProject();
        return getEnvironment().createBoxed(this, javaProject).canAssignTo(lhs);
      }
      return false;
    }

    switch (((PrimitiveType) lhs).fId) {
      case BOOLEAN:
      case BYTE:
      case CHAR:
        return false;
      case DOUBLE:
        switch (fId) {
          case BYTE:
          case CHAR:
          case SHORT:
          case INT:
          case LONG:
          case FLOAT:
            return true;
          default:
            return false;
        }
      case FLOAT:
        switch (fId) {
          case BYTE:
          case CHAR:
          case SHORT:
          case INT:
          case LONG:
            return true;
          default:
            return false;
        }
      case LONG:
        switch (fId) {
          case BYTE:
          case CHAR:
          case SHORT:
          case INT:
            return true;
          default:
            return false;
        }
      case INT:
        switch (fId) {
          case BYTE:
          case CHAR:
          case SHORT:
            return true;
          default:
            return false;
        }
      case SHORT:
        return (fId == BYTE);
    }
    return false;
  }

  @Override
  public String getName() {
    return NAMES[fId];
  }

  @Override
  protected String getPlainPrettySignature() {
    return NAMES[fId];
  }
}
